-- Codename Radical by Basil Voronkov
-- Module 'bonus'
---------------------------------------------
-- Implements achivements.
require "lib/core"
require "lib/const"
require "lib/mainmenu"

bonus = {
  arr = {},
  chapters = {},
  tabl = {},
  chapterx = 640,
  chaptery = 50,
  chapterfont = "sans-b.ttf",
  chapterfontsize = 22,
  chaptermap = nil,
  chaptercount = 0
}

function bonus.init()
  bonus.arr = {};
  bonus.tabl = {};
  bonus.chapters = {};
  bonus.chaptercount = 0;
  bonus.register("1-start", "Мертвый час", "Катя просыпается среди ночи. История началась.", "clock", 640, 160);
  bonus.register("1-med", "Мертвый час", "Катя исследует этажи медицинского центра.", "wire", 820, 210);
  bonus.register("1-help", "Мертвый час", "Катя помогает незнакомцу в метро.", "drug", 720, 270);
  bonus.register("1-tea", "Мертвый час", "Катя готовит отцу целебный чай.", "table", 600, 370);
  bonus.register("2-book", "Падение", "Петр исследует заброшенное здание.", "book", 740, 140);
  bonus.register("2-acid", "Падение", "Петр сразу догадывается облить стену кислотой.", "barrel", 640, 190);
  bonus.register("3-ware", "Дознание", "Посторонним вход воспрещен! Катя в офисе строительной компании.", "33", 780, 240);
  bonus.register("3-inter", "Дознание", "Петр успешно допрашивает задержанную.", "inter", 640, 160);
  bonus.register("3-photo", "Дознание", "Петр сразу замечает на снимке необычный грузовик.", "photo", 660, 280);
  bonus.register("3-window", "Дознание", "Катя решает проветрить комнату перед сном.", "books", 720, 370);
  bonus.register("4-drug", "Режим", "Фён отказывается принимать таблетку.", "drugs", 640, 160);
  bonus.register("4-escape", "Режим", "Фён находит выход из темного коридора.", "escape", 740, 200);
  bonus.register("4-date", "Режим", "Петр точно помнит дату падения Ока.", "date", 620, 280);
  sys_bonuses = bonus.gallery();
end

function bonus.unlock(nam)
  prefs["bonus_"..nam] = true;
end

function bonus.unlocked(nam)
  return true--prefs["bonus_"..nam];
end

function bonus.register(key, nam, dsc, pic, x, y)
  if bonus.tabl[nam] == nil then
    bonus.chaptercount = bonus.chaptercount+1;
    table.insert(bonus.chapters, {nam=nam,ch=bonus.chaptercount});
    bonus.tabl[nam] = nam;
  end
  table.insert(bonus.arr, {key=key,ch=bonus.chaptercount,nam=nam,dsc=dsc,pic=pic,x=x,y=y});
end

function bonus.gallery()
  local ret = engine.gameroom {
     tile       = mainmenu.image
    ,hidemenu   = true
    ,fps        = 20
    ,build      = function(s)
                    s.arr = {};
                    s.chaptercount = 0;
                    local tmp = {};
                    for i,a in ipairs(bonus.arr) do
                      if bonus.unlocked(a.key) and tmp[a.ch] == nil then
                        table.insert(s.arr, bonus.chapters[a.ch]);
                        tmp[a.ch] = 0;
                        s.chaptercount = s.chaptercount+1;
                      end
                    end
                  end
    ,drawitem   = function(s,p,a,dark)
                    local spr = sprite.load(const.path.bonus..a.pic..".jpg");
                    local sw,sh = sprite.size(spr);
                    
                    local box = sprite.box(sw+10,sh+10,"#464646");
                    sprite.draw(box, p, a.x-5, a.y-5);
                    sprite.free(box);
                    
                    local box = sprite.box(sw+8,sh+8, "#999999");
                    sprite.draw(box, p, a.x-4, a.y-4);
                    sprite.free(box);
                    
                    sprite.draw(spr, p, a.x, a.y, alpha);
                    sprite.free(spr);
                    
                    if dark then
                      local spr = sprite.box(sw+10,sh+10,"black",150);
                      sprite.compose(spr, p, a.x-5, a.y-5);
                      sprite.free(spr);
                    end
                    if not dark then
                      s.bmap:add(a.key, a.x-5, a.y-5, sw+10, sh+10);
                    end
                  end
    ,ondrawbg   = function(s,p)
                    s:build();
                    s.map = map(0, 0, const.winwidth, const.winheight);
                    s.bmap = map(0, 0, const.winwidth, const.winheight);
                    s.bontab = {};
                    drawing.draw_pic(p, const.path.ui.."next2.png", 10, 570);
                    drawing.draw_text(p, "Вернуться", 20, 570, "white", const.font, 14);
                    s.map:add("close", 10, 570, 80, drawing.text_height(const.font, 14));
                    drawing.draw_text(p, "Достижения", 60, 260, "white", const.fontb, 24);
                    
                    if s.chaptercount == 0 then
                      drawing.draw_text(p, "Не открыто ни одного достижения.", episodes.epx, episodes.chaptery, const.textcolor, episodes.chapterfont, episodes.epfontsize);
                      return p;
                    end
                    
                    --Chapters
                    if s._selchapter == nil or s._selchapter > s.chaptercount then
                      s._selchapter = 1;
                    end
                    drawing.draw_text(p, "Глава "..tostring(s._selchapter), bonus.chapterx, bonus.chaptery, const.textcolor, bonus.chapterfont, bonus.epfontsize);
                    drawing.draw_text(p, s.arr[s._selchapter].nam,  bonus.chapterx, bonus.chaptery+18, "white", bonus.chapterfont, bonus.chapterfontsize);
                    local up,dn = "up.png","down.png";
                    if s._selchapter == 1 then
                      up = "up_dis.png";
                    end
                    if s._selchapter == s.chaptercount then
                      dn = "down_dis.png";
                    end
                    drawing.draw_pic(p, const.path.ui..up, bonus.chapterx, bonus.chaptery - 15);
                    drawing.draw_pic(p, const.path.ui..dn, bonus.chapterx, bonus.chaptery + 50);
                    s.bmap:add("up", bonus.chapterx, bonus.chaptery - 15, 18, 9);
                    s.bmap:add("down", bonus.chapterx, bonus.chaptery + 50, 18, 9);
                    
                    --Episodes
                    for i,a in ipairs(bonus.arr) do
                      if a.ch == s._selchapter then
                        local dark = true;
                        if bonus.unlocked(a.key) then
                          dark = false;
                          s.bontab[a.key] = a.dsc;
                        end
                        s:drawitem(p, a, dark);
                      end
                    end
                    
                    return p;
                  end
    ,ontimer    = function(s, x, y)
                    local sel = s.bmap:get(x, y);
                    if s.oldbsel ~= nil then
                      drawing.clean(s.pic, bonus.chapterx, s.oldbsel, 18, 9);
                      s.oldbsel = nil;
                    end
                    if s.oldhint ~= nil then
                      drawing.clean(s.pic, s.oldhint[1]-450, s.oldhint[2], 450, 30);
                      s.oldhint = nil;
                    end
                    if sel == "up" and s._selchapter > 1 then
                      drawing.copy_pic(s.pic, const.path.ui.."up_sel.png", bonus.chapterx, bonus.chaptery - 35);
                      s.oldbsel = bonus.chaptery - 35;
                    elseif sel == "down" and s._selchapter < s.chaptercount then
                      drawing.copy_pic(s.pic, const.path.ui.."down_sel.png", bonus.chapterx, bonus.chaptery + 30);
                      s.oldbsel = bonus.chaptery + 30;
                    elseif sel ~= nil then
                      local dsc = s.bontab[sel];
                      if dsc ~= nil then
                        local ai,ay = s.bmap.items_[sel][1],s.bmap.items_[sel][2];
                        drawing.textframe(s.pic, dsc, ai-5, ay-18, 4, 2, true);
                        s.oldhint = {ai,ay-18};
                      end
                    end
                  end
    ,onclick    = function(s, x, y)
                    local sel = s.map:get(x, y);
                    if sel == "close" then
                      play_sound("flash");
                      walkblack_("sys_menuroom")();
                      return;
                    end
                    local sel = s.bmap:get(x, y);
                    if sel == "up" and s._selchapter > 1 then
                      s._selchapter = s._selchapter - 1;
                      play_sound("switch");
                      refresh();
                    elseif sel == "down" and s._selchapter < s.chaptercount then
                      s._selchapter = s._selchapter + 1;
                      play_sound("switch");
                      refresh();
                    end
                    return true;
                  end
  }
  ret.kbd       = function(s)
                    play_sound("flash");
                    walkblack_("sys_menuroom")();
                    return true;
                  end
  return ret;
end